#ifndef CHAT_MESSAGE_HPP
#define CHAT_MESSAGE_HPP 
#endif
#include <cstdio>
#include <cstdlib>
#include <cstring>

class chat_message {
public:
	enum { header_length = 4 };
	enum { max_body_length = 512 };

	chat_message() : body_length_(0) {}

	const char*data() const { return data_; }

	char *data() { return data_; }
	
	std::size_t length() const { return header_length + body_length_; }
	
	const char *body() const { return data_ + header_length; }
	//后面的const表示this指针为cosnt指针
	char *body() { return data_ + header_length; }

	std::size_t body_length() const {return body_length_; }

	void body_length(std::size_t new_length) {
		body_length_ = new_length;
		if(body_length_ > max_body_length)
			body_length_ = max_body_length;
			//问题：给clnt发513个字节，但是=512，就会出错
	}
	//解码，包头atoi，比较是否为合法(<512)的包体长度
	bool decode_header() {
		char header[header_length + 1] = "";
		std::strncat(header, data_, header_length);
		body_length_ = std::atoi(header);
		if(body_length_ > max_body_length) {
			body_length_ = 0;
			return false;
		}
		return true;
	}
	//把包体长度转为字符串加入包
	void encode_header() {
		char header[header_length + 1] = "";
		std::sprintf(header, "%4d", static_cast<int>(body_length_));
		std::memcpy(data_, header, header_length);//4个字节的头部放入data_
	}
private:
	char data_[header_length + max_body_length];
	std::size_t body_length_;
};
